import 'dart:core'; // dart:core 会自动导入，这里写出来更清晰

void main() {
  print('--- URI 示例开始 ---');

  // --- URI ---

  print('\n--- 编码和解码完整 URI ---');
  // encodeFull/decodeFull: 编码/解码字符，但保留 URI 特殊含义的字符（如 /, :, &, # 等）
  var uriString1 = 'https://example.org/api?foo=some message&bar=baz#section';
  var encoded1 = Uri.encodeFull(uriString1);
  // 注意只有 "some message" 中的空格被编码了
  print('原始 URI 1: $uriString1');
  print('encodeFull 结果: $encoded1');
  assert(
    encoded1 == 'https://example.org/api?foo=some%20message&bar=baz#section',
  );

  var decoded1 = Uri.decodeFull(encoded1);
  print('decodeFull 结果: $decoded1');
  assert(uriString1 == decoded1);

  print('\n--- 编码和解码 URI 组件 ---');
  // encodeComponent/decodeComponent: 编码/解码所有在 URI 中有特殊含义的字符
  var uriString2 = 'https://example.org/api?foo=some message';
  var encoded2 = Uri.encodeComponent(uriString2);
  // 所有特殊字符如 :, /, ?, = 都被编码了
  print('原始 URI 2: $uriString2');
  print('encodeComponent 结果: $encoded2');
  assert(encoded2 == 'https%3A%2F%2Fexample.org%2Fapi%3Ffoo%3Dsome%20message');

  var decoded2 = Uri.decodeComponent(encoded2);
  print('decodeComponent 结果: $decoded2');
  assert(uriString2 == decoded2);

  print('\n--- 解析 URI ---');
  // 使用 Uri.parse() 从字符串创建 Uri 对象
  var uri3 = Uri.parse('https://example.org:8080/foo/bar?q=dart#frag');
  print('解析 URI: ${uri3.toString()}');

  assert(uri3.scheme == 'https'); // 协议
  assert(uri3.host == 'example.org'); // 主机名
  assert(uri3.port == 8080); // 端口
  assert(uri3.path == '/foo/bar'); // 路径
  assert(uri3.query == 'q=dart'); // 查询字符串
  assert(uri3.queryParameters['q'] == 'dart'); // 以 Map 形式访问查询参数
  assert(uri3.fragment == 'frag'); // 片段标识符 (# 后面的部分)
  assert(uri3.origin == 'https://example.org:8080'); // 源 (协议 + 主机 + 端口)
  assert(
    uri3.pathSegments.length == 2 &&
        uri3.pathSegments[0] == 'foo' &&
        uri3.pathSegments[1] == 'bar',
  ); // 路径分段
  print('Scheme: ${uri3.scheme}');
  print('Host: ${uri3.host}');
  print('Port: ${uri3.port}');
  print('Path: ${uri3.path}');
  print('Path Segments: ${uri3.pathSegments}');
  print('Query: ${uri3.query}');
  print('Query Parameters: ${uri3.queryParameters}');
  print('Fragment: ${uri3.fragment}');
  print('Origin: ${uri3.origin}');

  print('\n--- 构建 URI ---');
  // 使用 Uri() 构造函数进行完全控制
  var uri4 = Uri(
    scheme: 'https',
    userInfo: 'user:pass', // 可选的用户信息
    host: 'example.org',
    port: 9090, // 可选的端口
    path: '/foo/bar', // 路径通常以 / 开头
    queryParameters: {'lang': 'dart', 'topic': 'uri'}, // 构建查询字符串
    fragment: 'frag', // # 后面的部分
  );
  // toString() 会重新构建 URI 字符串
  print('使用 Uri() 构建的 URI 4: ${uri4.toString()}');
  assert(
    uri4.toString() ==
        'https://user:pass@example.org:9090/foo/bar?lang=dart&topic=uri#frag',
  );

  // 使用 Uri.http 或 Uri.https 工厂构造函数处理常见情况
  // Uri.http(authority, unencodedPath, [queryParameters])
  var httpUri = Uri.http('example.org', '/foo/bar', {'lang': 'dart'});
  // Uri.https(authority, unencodedPath, [queryParameters])
  var httpsUri = Uri.https('example.org', 'path with space/baz', {
    'id': '123',
  }); // 路径段会被编码

  print('使用 Uri.http 构建的 URI: $httpUri');
  print('使用 Uri.https 构建的 URI: $httpsUri');
  assert(httpUri.toString() == 'http://example.org/foo/bar?lang=dart');
  assert(
    httpsUri.toString() == 'https://example.org/path%20with%20space/baz?id=123',
  );

  print('\n--- 解析相对 URI ---');
  var baseUri = Uri.parse('https://example.org/a/b/c');
  print('基础 URI: $baseUri');

  var relativeUri1 = baseUri.resolve('d'); // 相对于当前路径段
  var relativeUri2 = baseUri.resolve('/e/f'); // 相对于主机
  var relativeUri3 = baseUri.resolve('../g'); // 向上导航一级
  var relativeUri4 = baseUri.resolve('../../h?q=x'); // 向上导航两级并带查询参数

  print('解析 "d": $relativeUri1');
  print('解析 "/e/f": $relativeUri2');
  print('解析 "../g": $relativeUri3');
  print('解析 "../../h?q=x": $relativeUri4');

  assert(relativeUri1.toString() == 'https://example.org/a/b/d');
  assert(relativeUri2.toString() == 'https://example.org/e/f');
  assert(relativeUri3.toString() == 'https://example.org/a/g');
  assert(relativeUri4.toString() == 'https://example.org/h?q=x');

  print('\n--- 所有 URI 示例断言通过 ---');
}
